Question #1
Given the following class definitions, write down the output of the following program segment and explain each line of output:
class C { public:C() {
cout << "C::C()" << endl; } C(int) { cout << "C::C(int)" << endl;}
C(const C&) { cout << "C::C(const C&)" << endl; } C& operator=(const C&) { cout << "C::operator=(const C&)" << endl; return *this; } ~C() { cout << "C::~C()" << endl; } }; C func(C c1) { C c2(5); c2 = c1; return c2; } CODE SEGMENT: ... { C c1,c2; c2 = func(c1); } ...
Consider the following definitions. Give the OUTPUT of the following program segment, and briefly explain what caused the line to be printed
int A = 3;
class Base { public: Base() { A = A + 2; cout << "Base::Base()" << endl; } Base(const Base&) { A = A - 1; cout << "Base::Base(const Base&)" << endl; } ~Base() { A = 2*A; cout << "Base::~Base()" << endl; } }; class Derived: public Base { public: Derived() { A = 3*A; cout << "Derived::Derived()" << endl; } Derived(const Derived& d):Base(d) { A = A - 2; cout << "Derived::Derived(const Derived&)" << endl; } ~Derived() { A = A + 4; cout << "Derived::~Derived" << endl; } }; .... { Derived d1, d2(d1); } cout << "A = " << A << endl; ...
Given the following
definitions for class stack,
implement methods push, pop
and empty:
struct stack_node { int element; stack_node* next; }; class stack {
// LINKED STACK: // stack S; // S.push(3); S.push(5); S.push(2); --> // // S.top->element = 2 // ->next -> element = 5 // -> next -> element = 3 // -> next = NULL; // S.pop() == 2 // S.pop() == 5 // S.pop() == 3// S.empty() == true
private: stack_node * top; public: stack():top(NULL) { } ~stack() { while(!empty()) pop(); } void push(int); // YOU IMPLEMENT IT! int pop(); // YOU IMPLEMENT IT! bool empty() const; // YOU IMPLEMENT IT! };
Implement a string class. The Sting class is a wrapper for a char*. Implement the copy constructor (1), destructor (2) and method length (3). Overload operator<< (4) and operator+ (5). For strings
s1("hello"), s2(" world") s3 = s1 + s2;
s3 becomes "hello world", while s1 and s2 remain unchanged. operator<< prints the string to an output stream. The implementation of the default constructor, should help you understand how an instance of class String is represented. You may use:
int strlen(char* s); // returns the length of s void strcpy(char* s1, char* s2); // copies the characters from // s2 into s1 class String { private: char* s; // 0 byte terminated, dynamic array of characters public: String(char* =NULL); // default and one argument constructor // IMPLEMENT THE METHODS BELOW: String(const String&); // copy constructor // return a new string, which is obtained by // appending the argument string to a copy of s String operator+(const String&) const; ~String(); // destructor int length() const; // length of string friend ostream& operator<<(ostream&,const String&); }; String::String(char* str) { if (str == NULL) { s = str; return; } s = new char[strlen(str)+1]; strcpy(s,str); }